//
//  HMEmoticonTools.swift
//  WeiBo14
//
//  Created by HM on 16/3/12.
//  Copyright © 2016年 HM. All rights reserved.
//  表情数据操作的工具类

import UIKit

// 一页的表情数量
let HMEmoticonsPageCount = 20

class HMEmoticonTools: NSObject {

    // 单例
    static let sharedTools: HMEmoticonTools = HMEmoticonTools()
    
    /// 表情数据的bundle
    lazy var emoticonsBundle: NSBundle = {
        // 1. 获取到 Emoticons.Bundle的路径
        let path = NSBundle.mainBundle().pathForResource("Emoticons.bundle", ofType: nil)!
        // 2. 加载bundle
        let bundle = NSBundle(path: path)!
        return bundle
    }()
    
    /// 最近表情
    lazy var recentEmoticons: [HMEmoticon] = {
        // 从文件里面读取最近表情
        if let result = NSKeyedUnarchiver.unarchiveObjectWithFile(self.recentEmoticonPath) as? [HMEmoticon] {
            // 如果有值并且值是 [HMEmotion] 类型的话就直接返回
            return result
        }
        return [HMEmoticon]()
    }()
    
    /// 读取默认表情
    lazy var defaultEmoticons: [HMEmoticon] = {
        return self.emoticonsWithFolderName("default")
//        // 1. 从EmoticonBundle里面找到默认表情的info.plist的路径
//        let path = self.emoticonsBundle.pathForResource("default/info.plist", ofType: nil)!
//        
//        // 2. 读取 info.plist 
//        let array = NSArray(contentsOfFile: path)!
//        // 返回值
//        var result = [HMEmoticon]()
//        // 3. 遍历字典转模型
//        for value in array {
//            let dict = value as! [String: AnyObject]
//            // 字典转模型
//            let emoticon = HMEmoticon(dict: dict)
//            result.append(emoticon)
//        }
//        // 4. retrun
//        return result
    }()
    
    // Emoji表情
    lazy var emojiEmoticons: [HMEmoticon] = {
        return self.emoticonsWithFolderName("emoji")
    }()
    
    /// 浪小花表情
    lazy var lxhEmoticons: [HMEmoticon] = {
        return self.emoticonsWithFolderName("lxh")
    }()
    
    
    /// collectionView 所需要的表情数据
    lazy var allEmoticons: [[[HMEmoticon]]] = {
        return [
        [self.recentEmoticons],// 因为最近表情只有一页,所以不用去截取
        self.typeEmoticonPages(self.defaultEmoticons),
        self.typeEmoticonPages(self.emojiEmoticons),
        self.typeEmoticonPages(self.lxhEmoticons)
        ]
    }()
    
    private override init(){}
    
    
    /// 最近表情的保存路径
    private lazy var recentEmoticonPath: String = {
        let path = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("recente.archive")
        return path
    }()
    
    
    /// 通过表情字符串,去查找其对应的表情模型
    ///
    /// - parameter chs: 表情字符串
    ///
    /// - returns: <#return value description#>
    func emoticonWithChs(chs: String) -> HMEmoticon? {
        
        
        
        // 1. 从默认里面取
        if let result = defaultEmoticons.filter({
             $0.chs == chs
        }).first {
            return result
        }
        
        // 2. 从浪小花里面取
        if let result = lxhEmoticons.filter({
             $0.chs == chs
        }).first {
            return result
        }
        

        
        
//        // 1. 从默认里面取
//        let defaultResults = defaultEmoticons.filter { (emoticon) -> Bool in
//            if emoticon.chs == chs {
//                return true
//            }
//            return false
//        }
//        
//        if defaultResults.count > 0 {
//            return defaultResults.first
//        }
//        
//        // 2. 从浪小花里面取
//        let lxhResults = lxhEmoticons.filter { (emoticon) -> Bool in
//            if emoticon.chs == chs {
//                return true
//            }
//            return false
//        }
//        
//        if lxhResults.count > 0 {
//            return lxhResults.first
//        }
//
        
        
        
        
//        // 1. 先从默认里面找
//        for value in defaultEmoticons {
//            if value.chs == chs {
//                return value
//            }
//        }
//        
//        // 2. 从浪小花里面找
//        for value in lxhEmoticons {
//            if value.chs == chs {
//                return value
//            }
//        }
        
        return nil
    }
    
    // MARK: - 供外界调用的方法
    func saveRecentEmoticon(emoticon: HMEmoticon) {
        
        // 0. 判断里面是否有该表情,如果有,先移除
        // 不要在遍历数组的时候,去移除数组里面的内容
//        for (index,value) in recentEmoticons.enumerate() {
//            // 表情类型相同才判断是否是同一个表情
//            if value.type == emoticon.type {
//                if value.type == "0" {
//                    // 判断png是否相同
//                    if value.png == emoticon.png {
//                        // 两个表情是同一个表情
//                        recentEmoticons.removeAtIndex(index)
//                    }
//                }else{
//                    // 判断code是否同
//                    if value.code == emoticon.code {
//                        recentEmoticons.removeAtIndex(index)
//                    }
//                }
//            }
//        }
        
        
        // $0代表是闭包里面第1个参数 --> 依次类推
        // 如果闭包里面只有一行代码,可以省略return
        let result = recentEmoticons.filter {
//            if $0.type == "0" {
//                // 判断png是否相同
//                return $0.png == emoticon.png
//            }else{
//                // 判断code是否同
//                return $0.code == emoticon.code
//            }
            $0.type == "0" ? $0.png == emoticon.png : $0.code == emoticon.code
        }
        
        
        // filter 过滤出自己需要的数据
//        let result = recentEmoticons.filter { (value) -> Bool in
//            if value.type == "0" {
//                // 判断png是否相同
//                if value.png == emoticon.png {
//                    // 两个表情是同一个表情
//                    return true
//                }
//            }else{
//                // 判断code是否同
//                if value.code == emoticon.code {
//                    return true
//                }
//            }
//            return false
//        }
        
        
        for value in result {
            let index = recentEmoticons.indexOf(value)!
            recentEmoticons.removeAtIndex(index)
        }
        
//        // 转成array
//        let array = NSMutableArray(array: recentEmoticons)
//        
//        for value in result {
//            array.removeObject(value)
//        }
//        
//        print(array)
        
        // 1. 把表情加到最近表情的数组里面
        recentEmoticons.insert(emoticon, atIndex: 0)
        
        // 如果个数超过20,移除掉
        while recentEmoticons.count > 20 {
            recentEmoticons.removeLast()
        }
        
        // 2. 把数组归档
        NSKeyedArchiver.archiveRootObject(recentEmoticons, toFile: recentEmoticonPath)
        
        // 更新表情数据里面的最近表情的数据
        allEmoticons[0][0] = recentEmoticons
    }
    
    // MARK: - 私有方法
    
    /// 返回某种表情分成的二维数组
    private func typeEmoticonPages(emoticons: [HMEmoticon]) -> [[HMEmoticon]] {
        // 1. 计算出一共有几页
        let pageCount = (emoticons.count - 1) / HMEmoticonsPageCount + 1
        // 定义返回数组
        var result: [[HMEmoticon]] = [[HMEmoticon]]()
        // 2. 遍历页数,截取对应页数的表情数组
        for i in 0..<pageCount {
            
            // 计算从哪儿开始截取
            let location = i * HMEmoticonsPageCount
            // 设置截取的长度
            var len = HMEmoticonsPageCount
            
            if location + len > emoticons.count {
                len = emoticons.count - location
            }
            let range = NSMakeRange(location, len)
            //subarrayWithRange --> 传入一个NSRange,会返回这个范围所对应的数组
            // 每一页的数组
            let subArray = (emoticons as NSArray).subarrayWithRange(range) as! [HMEmoticon]
            // 3. 再把截取出来的数组放到一个数组里面
            result.append(subArray)
        }
        return result
    }
    
    /// 传入表情文件夹的名字,去读取该表情数组
    ///
    /// - parameter folderName: 文件夹名字
    ///
    /// - returns: 表情数组
    private func emoticonsWithFolderName(folderName: String) -> [HMEmoticon] {
        // 1. 从EmoticonBundle里面找到默认表情的info.plist的路径
        let path = self.emoticonsBundle.pathForResource("\(folderName)/info.plist", ofType: nil)!
        
        // 2. 读取 info.plist
        let array = NSArray(contentsOfFile: path)!
        // 返回值
        var result = [HMEmoticon]()
        // 3. 遍历字典转模型
        for value in array {
            let dict = value as! [String: AnyObject]
            // 字典转模型
            let emoticon = HMEmoticon(dict: dict)
            // 记录当前表情按钮所对应的文件夹名字,以便在显示图片表情的时候,读取表情数据
            emoticon.folderName = folderName
            result.append(emoticon)
        }
        // 4. retrun
        return result
    }
}


